/* 登录注册相关的接口 */
const express = require('express');

const passport = require('passport');       // 使用passport验证token

const Profile = require('../models/profile');

const nodeExcel = require('excel-export');
const fs = require('fs');
const exportExcel = require('../public/export');


const router = express.Router();

// @route  GET /test
// @desc   测试mongoose模型是否成功,成功返回json字符串
// @access Public
router.get('/test', (req,res) => {
    res.json({msg:'测试成功'})
})

/** 
 * @route  GET /export
 * @desc   实现一个导出excel功能，暂时使用死数据生成excel，后续查数据库
 * @access Private(需要验证token)
*/
router.post('/export', passport.authenticate('jwt',{session:false}), (req,res) => {
    /* 方式一：后端生成excel，利用express的res.download实现文件下载 */
        let conf = {};
        // 定义sheet风格样式
        //conf.stylesXmlFile = 'styles.xml';
        // 定义sheet名称
        conf.name = 'DBData';
        // 定义列的名称以及数据类型
        conf.cols = [
            {
                caption: 'Name',
                type:'string'
            },
            {
                caption: 'Type',
                type: 'number'
            },
            {
                caption: 'cls',
                type: 'number'   
            }
        ];
        // 定义行数据，注意与列对应
        conf.rows = [
            ['wyt',22],
            ['lhc',25],
            ['curry',33],
            ['jhc',36]
        ]
        // 将编好的数据传入，生成表格数据。返回值为二进制数据
        let result = nodeExcel.execute(conf);
        // fs将文件写到内存
        fs.writeFile(`/VsCodeProject/CRM/crm-server/public/test1.xlsx`,result,'binary',(err) => {
            if(err) {
                return console.log(err)
            }
            //return res.download(`/VsCodeProject/CRM/crm-server/public/test1.xlsx`);
        });
        res.end(result,'binary')
        

    /*// 設置響應頭
    res.setHeader('Content-Type', 'application/vnd.openxmlformats;charset=utf-8');
    //if判断这一段可以不需要 是我在写爬虫获取的时候 保存了一个文本信息到global中 用来导出对应页面 名称excel文件名用的
    // encodeURIComponent（）方法用来处理 中文文件名 防止乱码 如果是导出文件名为英文名 可以不需要
    if (global.restaurant) {
        res.setHeader("Content-Disposition", "attachment; filename=" + encodeURIComponent(global.restaurant) + ".xlsx");
    } else {
        res.setHeader("Content-Disposition", "attachment; filename=" + encodeURIComponent("食物商品信息") + ".xlsx");
    }
    //最终返回excel二进制文件流
    console.log(global.foodData);
    res.end(exportExcel(global.foodData), 'binary'); */


    /** 方式二：后端返回Blob流，前端通过Blob实现下载 */


    /** 方式三：后端直接返回给前端下载链接，前端无需通过blob */
})

// @route  POST /add
// @desc   创建信息接口
// @access Private(需要验证token)
router.post('/add',passport.authenticate('jwt',{session:false}), (req,res) => {
    const profileFields = {};
    
    if(req.body.type) profileFields.type = req.body.type;
    if(req.body.describe) profileFields.describe = req.body.describe;
    if(req.body.income) profileFields.income = req.body.income;
    if(req.body.expend) profileFields.expend = req.body.expend;
    if(req.body.cash) profileFields.cash = req.body.cash;
    if(req.body.remark) profileFields.remark = req.body.remark;

    new Profile(profileFields).save()
                              .then(profile => {
                                  res.json(profile)
                              })
})

// @route  GET /profile
// @desc   获取所有信息
// @access Private(需要验证token)
router.get('/profile',passport.authenticate('jwt',{session:false}),(req,res) => {
    Profile.find()
           .then(profile => {
               if(!profile) {
                   return res.status(404).json("没有数据")
               }
               res.json(profile)
           })
           .catch(err => res.status(404).json(err))
})

// @route  POST /
// @desc   获取单个信息
// @access Private(需要验证token)
router.get('/:id',passport.authenticate('jwt',{session:false}),(req,res) => {
    Profile.findOne({_id:req.params.id})
           .then(profile => {
               if(!profile) {
                   return res.status(404).json("没有数据")
               }
               res.json(profile)
           })
           .catch(err => res.status(404).json(err))
})

// @route  POST /edit
// @desc   根据id修改对应信息
// @access Private(需要验证token)
router.post('/edit/:id',passport.authenticate('jwt',{session:false}), (req,res) => {
    const profileFields = {};
    
    if(req.body.type) profileFields.type = req.body.type;
    if(req.body.describe) profileFields.describe = req.body.describe;
    if(req.body.income) profileFields.income = req.body.income;
    if(req.body.expend) profileFields.expend = req.body.expend;
    if(req.body.cash) profileFields.cash = req.body.cash;
    if(req.body.remark) profileFields.remark = req.body.remark;
    Profile.findOneAndUpdate({_id:req.params.id},{$set:profileFields},{new:true})
           .then(profile => {
                res.json(profile)
           })
})

// @route  GET /delete
// @desc   根据id删除对应信息
// @access Private(需要验证token)
router.get('/delete/:id',passport.authenticate('jwt',{session:false}), (req,res) => {
    Profile.findOneAndRemove({_id:req.params.id})
           .then(profile => {
                profile.save().then(profile => res.json(profile))
           })
           .catch(err => res.status(404).json('删除失败'))
})


module.exports = router